package com.liu.recursive;
public class WhatRecursive {
    // 找重复：找到规模更小的原问题的重复问题 --- 子问题
    // 找变化：变化的量作为参数
    // 找边界：出口
    public static void main(String[] args) {
        f1(10);
        System.out.println("------------------------------");
        System.out.println(f2(5));
        System.out.println("------------------------------");
        f3(5,9);
        System.out.println("------------------------------");
        int res = awaysSum(new int[]{1, 2, 3, 4, 5, 6}, 0);
        System.out.println(res);
        System.out.println("------------------------------");
        String str = reserve("abcd", 3);
        System.out.println(str);

    }
    // 要避免死循环
    static void f1(int i){
        if (i == 0){
            return;
        }
        // 调用自身
        f1(i - 1);
    }

    // 求5的阶乘
    // 5 * 4 * 3 * 2 * 1
    // 找重复：找到规模更小的原问题的重复问题 --- 子问题
    // 找变化：变化的量作为参数
    // 找边界：出口
    static int f2(int n){
        if (n == 1){
            return 1;
        }
        return n * f2( n - 1);
    }

    // 求 i~ j
    static void f3(int i, int j){
        if (i > j){
            return;
        }
        System.out.print(i + " ");
        f3(i + 1,j);
    }

    // 求arr数组中所有所有元素的和
    static int awaysSum(int arr[],int begin){
        if (begin == arr.length - 1){
            return arr[begin];
        }
        return arr[begin] + awaysSum(arr, begin + 1);
    }

    // 翻转字符串
    static String reserve(String src,int end){
        if (end == 0){
            return "" + src.charAt(0);
        }
        return src.charAt(end) + reserve(src,end - 1);
    }

}
